#include <lkhos/arch/gdt.h>
#include <stdint.h>

#define GDT_ENTRY 5


uint64_t _gdt[GDT_ENTRY];
uint16_t _gdt_limit = sizeof(_gdt);

void set_gdt_entry(uint32_t index, uint32_t base, uint32_t limit, uint32_t flags) {
    _gdt[index] = SD_BASE_HIGH(base) | flags | SD_LIMIT_HIGH(limit) | SD_BASE_MID(base);
    _gdt[index] <<= 32;
    _gdt[index] |= SD_LOW(SD_BASE_LOW(base), SD_LIMIT_LOW(limit));
}

void _gdt_init() {
    set_gdt_entry(0, 0, 0, 0);
    set_gdt_entry(1, 0, 0xFFFFF, SD_CODE_R0);
    set_gdt_entry(2, 0, 0xFFFFF, SD_DATA_R0);
    set_gdt_entry(3, 0, 0xFFFFF, SD_CODE_R3);
    set_gdt_entry(4, 0, 0xFFFFF, SD_DATA_R3);
}